/**
 * 请求封装
 */
import {
	getApiServerUrl,
	getAppUpdateUrl,
	getLoginToken,
} from '@/src/config.js'
import $store from '@/src/stores/index.js'

export default {
	/**
	 * 发送普通请求（API）
	 *
	 * @param {object} options 请求参数，参考uni.request
	 * @param {boolean} checkResult 是否自动识别返回的Result
	 * @return Promise
	 */
	send: (options, checkResult = true) => {
		return new Promise((resolve, reject) => {
			$store
				.dispatch('checkNetwork')
				.then(() => {
					const token = getLoginToken()
					if (!options.header?.Authorization && token) {
						options.header = {
							Authorization: 'Bearer ' + token,
						}
					}
					// 有网络状态
					let option = {
						...options,
						url: options.url,
						//firstIpv4: true,
						timeout: options.timeout || 10000,
						success: (res) => {
							if (res.statusCode === 204) {
								reject({ message: '资料不存在' })
							} else if (res.statusCode === 404) {
								reject({ message: '资源获取失败，可能已经被删除' })
							} else if (res.statusCode !== 200) {
								reject({
									message: 'API服务器不可用（状态码：' + res.statusCode + '）',
								})
							} else {
								if (checkResult) {
									if (res.data.Result === true) {
										resolve({ data: res.data.Data, message: res.data.Message })
									} else {
										reject({ message: res.data.Message })
									}
								} else {
									resolve(res.data)
								}
							}
						},
						fail: (err) => {
							let error = err.message || '服务器未响应，请稍候重试'
							reject({ message: error })
						},
						complete: (res) => {
							if (res.statusCode === 401) {
								// 失效
								$store.dispatch('userLogout')
								uni.reLaunch({
									url: '/pages/login/login',
								})
							}
						},
					}
					uni.request(option)
				})
				.catch((err) => {
					// 无网络状态
					window.console.error(err)
					reject('无法与服务器通信，请确认网络是否正常')
				})
		})
	},
	/**
	 * 上传文件请求
	 *
	 * @param {Object} options 请求参数，参考uni.uploadFile
	 * @return Promise
	 */
	uploadFile: (options) => {
		return new Promise((resolve, reject) => {
			$store
				.dispatch('checkNetwork')
				.then(() => {
					const token = getLoginToken()
					if (token) {
						options.header = {
							Authorization: 'Bearer ' + token,
						}
					}
					// 有网络状态
					let option = {
						...options,
						url: options.url,
						//firstIpv4: true,
						success: (res) => {
							try {
								let data = JSON.parse(res.data)
								resolve(data)
							} catch (e) {
								reject({ message: '远程服务器错误' })
							}
						},
						fail: (err) => {
							reject(err)
						},
					}
					uni.uploadFile(option)
				})
				.catch((err) => {
					$store.dispatch('consoleError', err)
					// 无网络状态
					reject({ message: '无法与服务器通信，请确认网络是否正常' })
				})
		})
	},
	/**
	 * 获取API服务器访问地址
	 *
	 * @param {string} uri 相对路径
	 * @param {string} prefix 前置路径
	 * @returns string
	 */
	getApiServer: (url, prefix = 'api/') => {
		return getApiServerUrl(url, prefix)
	},
	/**
	 * 发送服务器请求（更新）
	 *
	 * @param {Object} options 请求参数，参考uni.request
	 * @param {boolean} local 是否开启本地服务器
	 * @return Promise
	 */
	updateApp: (options, local = false) => {
		return new Promise((resolve, reject) => {
			$store
				.dispatch('checkNetwork')
				.then(() => {
					// 有网络状态
					let option = {
						...options,
						url: getAppUpdateUrl(options.url, local),
						//firstIpv4: true,
						timeout: 5000,
						success: (res) => {
							if (res.data.Result === true) {
								resolve(res.data.Data)
							} else {
								let error = res.data.Message || '服务器未响应，请稍候重试'
								reject({ message: error })
							}
						},
						fail: (err) => {
							let error = err.message || '服务器未响应，请稍候重试'
							reject({ message: error })
						},
					}
					uni.request(option)
				})
				.catch(() => {
					// 无网络状态
					reject('无法与服务器通信，请确认网络是否正常')
				})
		})
	},
	/**
	 * 获取更新服务器路径
	 *
	 * @param {string} url 子路径
	 * @param {boolean} local 是否开启本地服务器
	 * @return string
	 */
	getAppServerUrl: (url, local = false) => {
		return getAppServer(url, local)
	},
}
